import asyncio
from db import (
    create_tables,
    CollegeVolunteeringScoresModel,
    add_object,
    get_db,
    SessionLocal
)  # 从 db 包导入
from sqlalchemy.orm import Session
from exts import db  # 从 exts 包导入数据库会话
from utils.scraper_util import get_browser_config, fetch_and_process_page
from utils.volunteerData_util import save_to_db  # 从 utils 包导入保存到数据库的函数
from crawl4ai import AsyncWebCrawler
from config import Config


def initialize_database():
    """初始化数据库（创建表）"""
    create_tables()
    print("数据库初始化完成!")


async def crawl_gaokao_choices():
    initialize_database()  # 初始化数据库

    try:
        browser_config = get_browser_config()
        session_id = "gaokao_choices_session"  # 定义会话 ID

        # 初始化状态变量
        page_number = 2141  # 页码
        province = 15  # 省份

        # 启动网络爬虫上下文
        # https://docs.crawl4ai.com/api/async-webcrawler/#asyncwebcrawler
        async with AsyncWebCrawler(config=browser_config) as crawler:
            while True:
                if province > 39:  # 爬取省份数量限制
                    break  # 爬取完成退出循环

                # 从当前页获取和处理数据
                datas, no_results_found = await fetch_and_process_page(
                    crawler,
                    page_number,
                    province,
                    Config.BASE_URL,
                    session_id,
                )

                if no_results_found:
                    print(f"没有找到高考专业分数线数据。切换到下一个省份")
                    province += 1  # 切换到下一个省份
                    page_number = 1  # 重置页码
                    continue  # 跳过当前省份

                # if no_results_found:
                #     print(f"没有找到高考专业分数线数据。{province}")
                #     break  # 跳过当前省份

                # if not datas:
                #     print(f"没有从页面提取场地 {page_number}.")
                #     break  # 没有提取到场地时停止爬行

                if page_number == 2141:
                    print(f"到达最后一页 {page_number}.")
                    break  # 没有提取到场地时停止爬行

                page_number += 1  # 翻到下一页

                # 请求之间要有礼貌地暂停，避免费率限制
                await asyncio.sleep(2)  # 根据需要调整睡眠时间

    except Exception as e:
        print(f"An error occurred: {e}")
        db.rollback()  # 发生错误时回滚事务
    finally:
        db.close()  # 确保关闭会话


async def main():
    """
    脚本的入口点。
    """
    await crawl_gaokao_choices()

if __name__ == "__main__":
    asyncio.run(main())

